#ifndef _PERTADT_H_
#define _PERTADT_H_

/* tipo de dato definido para el calendario */

typedef enum {MINUTO, HORA, DIA, SEM, MES, ANIO} TimeUnit;

/* tipo de elemento a almacenar en la red */
typedef void * elementT;

/* tipo de dato a la estructura oculta */
typedef struct pertCDT* pertADT;


/*
* ==========================================================
*	    --------------------------
*	   |CONTRATO DEL TAD: pertADT |
*	    --------------------------
* ==========================================================
*/

/*
* Funcion LoadPert
* -----------------------
* Recibe un archivo con la configuracion de una Red de Pert y crea 
* un grafo dirijido con dicha red. Invocarla previamente a utilizar
* cualquier otra funcion del contrato.
* 
* Precondicion: archivo correcto
* Postcondicion: red Pert creada - pertADT
* retorna: digrafo correctamente creado con la red, 
*	   	   NULL en caso de error.
*/
pertADT LoadPert( FILE * archivo );

/*
 * Funcion InsertTask
* ---------------------------
* Inserta una tarea elementT en la red pert
* 
* Precondicion: red pert creada - pertADT
* Postcondicion: nueva actividad insertada en la red pert
* retorna: 0 en caso de error
*	       1 en caso de exito
*/ 
int InsertTask( pertADT pert, char ** campos );

/* 
* Funcion DeleteTask
* -------------------------
* Borra una tarea elementT de la red Pert
* 
* Precondicion: red pert creada - pertADT
* Postcondicion: actividad eliminada de la red pert
* retorna: 0 en caso de error
*	   	   1 en caso de exito
*/
int DeleteTask( pertADT pert, char * nombreAct );

/* 
* Funcion ModifyTask
* ------------------------
* Modifica el contenido de una tarea elementT de la red Pert
* Entre sus modificaciones se encuentran: Descripcion,
* Duracion de la tarea y Precedencias de la misma.
* Si no es posible la modificacion no hay cambio alguno.
* 
* Precondicion: red pert creada - pertADT
* Postcondicion: actividad modificada
* retorna:  0 en caso de error
*	    	1 en caso de exito
*/

int ModifyTask( pertADT pert, int modchoice, char ** campos);


/*
* Funcion CalcEarlyTimes
* ----------------------------
* Calcula los comienzos de tarea temprana de todas las tareas de la Red 
*
* Precondicion: red pert creada - pertADT
* Postcondicion: -
*/
void CalcEarlyTimes( pertADT pert);

/*
* Funcion CalcLateTimes
* -----------------------------
* Calcula los tiempos tardios de todas las tareas de la red
*
* Precondicion: red pert creada - pertADT
* Postcondicion: - 
*/
void CalcLateTimes( pertADT pert );

/* 
* Funcion CalcMargin
* -------------------------------
* Calcula los margenes de holgura de todas las tareas de la red
*
* Precondicion: red pert creada - pertADT
* Postcondicion: -
*/
void CalcMargins ( pertADT pert );

/* 
* Funcion GetCPM
* -----------------------------
* Calcula el camino critico de la red.
*
* Precondicion: red pert creada - pertADT
* Postcondicion: -
* retorna: una cola con las tareas criticas del camino
*	   	   NULL en caso de error
*/
int GetCPM( pertADT pert );

/*
* Funcion CreateDotFIle
* -------------------------------
* Crea el archivo .dot para luego mostrar el grafo en pantalla
*
* Precondicion: red pert creada - pertADT
* Postcondicion: -
* retorna: el archivo .dot creado
*		   NULL en caso de error.
*/

FILE * CreateDotFile( pertADT pert );

/*
* Funcion Calendar
* -------------------------------
* Genera un calendario de actividades indicando la fecha de inicio y finalización
* de cada actividad, y la fecha de inicio y finalización del propio proyecto.
*/

int Calendar( pertADT pert, int frmLength, TimeUnit unit);

/*
* Funcion FreePert
* -------------------------------
* Libera los recursos de la red pert. Invocarla unicamente
* cuando no se va utilizar mas ninguna funcion del ADT pert.
*
* Precondicion: red pert creada, distinta de NULL
* Postcondicion: -
*/
void FreePert( pertADT pert );

#endif	/* _PERTADT_H_ */
